{
 "cells": [
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:41:16.406950Z",
     "start_time": "2025-06-10T05:41:16.400949Z"
    }
   },
   "source": [
    "import numpy as np \n",
    "import pandas as pd \n",
    "import matplotlib.pyplot as plt \n",
    "%matplotlib inline \n",
    "plt.style.use('ggplot')\n",
    "import seaborn as sns \n",
    "import score_card as sc\n",
    "import warnings \n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import lightgbm as lgb \n",
    "from lightgbm import plot_importance \n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import train_test_split \n",
    "from sklearn import metrics\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "\n",
    "import os \n",
    "os.chdir('F:/安装包/PPD-First-Round-Data-Updated/PPD-First-Round-Data-Update/')"
   ],
   "outputs": [],
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:41:21.292349Z",
     "start_time": "2025-06-10T05:41:20.492417Z"
    }
   },
   "source": [
    "df  = pd.read_csv('feature_select_data1.csv',encoding='gb18030')\n",
    "df.head()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "   UserInfo_1  UserInfo_3  WeblogInfo_2  WeblogInfo_4  WeblogInfo_5  \\\n",
       "0         1.0         4.0           1.0           1.0           1.0   \n",
       "1         1.0         4.0           0.0           1.0           1.0   \n",
       "2         1.0         3.0           0.0           2.0           2.0   \n",
       "3         4.0         1.0           NaN           NaN           NaN   \n",
       "4         5.0         1.0           0.0           1.0           1.0   \n",
       "\n",
       "   WeblogInfo_6  WeblogInfo_7  WeblogInfo_8  WeblogInfo_15  WeblogInfo_16  \\\n",
       "0           1.0            14             0              6              0   \n",
       "1           1.0            14             0              0              7   \n",
       "2           2.0             9             3              0              3   \n",
       "3           NaN             2             0              0              0   \n",
       "4           1.0             3             0              0              0   \n",
       "\n",
       "   ...  _companyaddress  _department  _turnover  _incomefrom  update_time_cnt  \\\n",
       "0  ...              0.0          0.0        0.0          0.0              1.0   \n",
       "1  ...              0.0          0.0        0.0          0.0              3.0   \n",
       "2  ...              0.0          0.0        0.0          0.0              1.0   \n",
       "3  ...              0.0          0.0        0.0          0.0              1.0   \n",
       "4  ...              0.0          0.0        0.0          0.0              2.0   \n",
       "\n",
       "   update_all_cnt  log_cnt  log_timespan  avg_log_timespan    Idx  \n",
       "0            11.0     19.0           1.0          0.631579  10001  \n",
       "1            21.0     24.0           1.0         10.375000  10002  \n",
       "2            10.0     14.0           1.0          0.500000  10003  \n",
       "3            10.0      7.0           5.0          0.000000  10006  \n",
       "4            10.0      5.0           0.0          1.400000  10007  \n",
       "\n",
       "[5 rows x 165 columns]"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>UserInfo_1</th>\n",
       "      <th>UserInfo_3</th>\n",
       "      <th>WeblogInfo_2</th>\n",
       "      <th>WeblogInfo_4</th>\n",
       "      <th>WeblogInfo_5</th>\n",
       "      <th>WeblogInfo_6</th>\n",
       "      <th>WeblogInfo_7</th>\n",
       "      <th>WeblogInfo_8</th>\n",
       "      <th>WeblogInfo_15</th>\n",
       "      <th>WeblogInfo_16</th>\n",
       "      <th>...</th>\n",
       "      <th>_companyaddress</th>\n",
       "      <th>_department</th>\n",
       "      <th>_turnover</th>\n",
       "      <th>_incomefrom</th>\n",
       "      <th>update_time_cnt</th>\n",
       "      <th>update_all_cnt</th>\n",
       "      <th>log_cnt</th>\n",
       "      <th>log_timespan</th>\n",
       "      <th>avg_log_timespan</th>\n",
       "      <th>Idx</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>11.0</td>\n",
       "      <td>19.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.631579</td>\n",
       "      <td>10001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>14</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>21.0</td>\n",
       "      <td>24.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>10.375000</td>\n",
       "      <td>10002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>9</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>14.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>10003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>10006</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>10.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.400000</td>\n",
       "      <td>10007</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 165 columns</p>\n",
       "</div>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 3
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 两种版本的lgb默认参数模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## sklearn版本"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:41:25.421675Z",
     "start_time": "2025-06-10T05:41:25.369226Z"
    }
   },
   "source": [
    "# 默认参数模型\n",
    "df_train, df_test = train_test_split(df[df.sample_status=='train'])\n",
    "x_train = df_train.drop(['Idx','sample_status','target'],axis=1)\n",
    "x_test = df_test.drop(['Idx','sample_status','target'],axis=1)\n",
    "y_train = df_train['target']\n",
    "y_test = df_test['target']"
   ],
   "outputs": [],
   "execution_count": 4
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:41:27.901694Z",
     "start_time": "2025-06-10T05:41:27.118408Z"
    }
   },
   "source": [
    "import time\n",
    "start = time.time()\n",
    "lgb_sklearn = lgb.LGBMClassifier(random_state=0).fit(x_train,y_train)\n",
    "end = time.time()\n",
    "print('运行时间为{}秒'.format(round(end-start,0)))"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Info] Number of positive: 1610, number of negative: 20764\n",
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.017214 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 23417\n",
      "[LightGBM] [Info] Number of data points in the train set: 22374, number of used features: 162\n",
      "[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.071959 -> initscore=-2.556987\n",
      "[LightGBM] [Info] Start training from score -2.556987\n",
      "运行时间为1.0秒\n"
     ]
    }
   ],
   "execution_count": 5
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:41:29.788480Z",
     "start_time": "2025-06-10T05:41:29.572364Z"
    }
   },
   "source": [
    "# 默认参数模型的AUC\n",
    "lgb_sklearn_pre = lgb_sklearn.predict_proba(x_test)[:,1]\n",
    "sc.plot_roc(y_test,lgb_sklearn_pre)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ],
      "image/png": "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RYsgVigiIhK+QiIs1BQULNnZJI0YXHpCZMsjcM6YRfGgwcEtTkREJMyFRFioiZGcjDtzPFFbNpM/7UGMZs3NLklERCTshFZYcLtJeOA+ii64EE/ntNJL427VUkgREZEG5PcEx5ycHDIyMujWrRs9evRg2rRpeDyeam+7cuVKhgwZQpcuXRg4cCCffPJJvQuN/nw1zfqegf2Jx3Fk3gReb+kXFBREREQalN9hISsrC7vdzqpVq1i0aBFr1qzhueeeO+h227ZtY8yYMWRmZvLFF18wZswYsrKy2L17t1+PF08BzSffStNhA7H9uhXvkUfhunsSREX5W7qIiIjUg19hYfv27axbt44JEyYQHx9PmzZtyMjIYMGCBQfd9s0336Rbt270798fm83GoEGDOO2003j11Vf9KnAhF9PkuSewGAYFl/0fuavWUpx+jl/fQ0REROrPrzkLmzZtIikpiVatWpVfa9++Pbt27WL//v00adKk/PrmzZs54YQTKt3/+OOP56effvKrwDYdE/EecS7ucRPwnNYD9Sc0nLIRHZvNWulMDmk4avPgU5sHn9o8+Gy2wG6j5FdYcLlcxMfHV7pW9rnb7a4UFqq7bVxcHG63278KX36ZKMDh373kMCQl1eNoTzksavPgU5sHn9o8dPkVPex2OwUFBZWulX2eUGWLxfj4eAoLCytdKywsPOh2IiIi0rj5FRY6dOhAXl4e2dnZ5de2bNlC69atcTgq/+1/wgknsGnTpkrXNm/eTIcOHQ6jXBEREQk2v8JC27Zt6dq1K9OnTyc/P5+dO3cyb948Ro4cedBthw4dyrp163j//ffxeDy8//77rFu3jmHDhgWseBEREWl4FsPwb7pJdnY2U6ZMYe3atVitVs4//3xuueUWoqKiSEtLY/LkyQwdOhSAVatW8fDDD7Njxw6OPvpoJkyYQJ8+fRrkBxEREZGG4XdYEBERkcgSEkdUi4iIiHkUFkRERKRWCgsiIiJSK4UFERERqZWpYcGsEywjmT9t/sorrzBgwADS0tIYMGBAtWeAyKH50+ZlfvnlFzp37szatWuDVGV48afN161bx4UXXkhaWhp9+vThySefDHK14cGfNn/++efp168fp556KkOGDGHp0qVBrja87N27l7PPPrvW14vDfg81THT55Zcb48ePN9xut7Fjxw7jvPPOM/79738fdLtff/3VOOWUU4yPPvrIKCkpMd577z2jU6dOxh9//GFC1aGtrm3+0UcfGd26dTM2bNhg+Hw+46uvvjK6detmLFmyxISqQ1td27yM2+02Bg8ebJxwwgnG559/HsRKw0dd23zz5s1G586djTfeeMPw+XzGjz/+aHTv3t344IMPTKg6tNW1zVesWGH07NnT2LJli2EYhrFkyRKjY8eOxs6dO4Ndclj44osvjP79+9f6ehGI91DTehbMOMEy0vnT5rt37+a6666jS5cuWCwW0tLS6NGjB+vXrzeh8tDlT5uXmTx5Mv379w9ileHFnzZ/+eWXSU9PZ/jw4VgsFjp27MjChQvp2rWrCZWHLn/afOvWrRiGUf4RFRVFdHQ0NptfRxUJpe+Nt9xyC2PHjj3k7Q73PdS0sHCoEywrCtQJlpHOnza/7LLLuP7668s/z8nJYf369aSmpgat3nDgT5sDvPXWW2zfvp3Ro0cHs8yw4k+bf/PNNxxzzDGMGzeOHj16MHDgQNatW0fLli2DXXZI86fNzzvvPJKTkxk0aBAnn3wymZmZPPDAA7Ru3TrYZYe8Xr168dFHHzFo0KBabxeI91DTwsKhTrA81G3rdYJlhPOnzSvas2cP1113HampqQwePLhBaww3/rT5li1bmDlzJo888ghRUTqMvb78afN9+/bxwgsvMHToUD777DOmTJnCgw8+yJIlS4JWbzjwp81LSkro2LEjr732Ghs3bmTKlClMnDiRn3/+OWj1houWLVvWqUcmEO+hpoUFnWAZfP60eZmNGzcycuRI2rVrx/z589VV6Ke6tnlRURFjx47lzjvv5KijjgpqjeHGn+d5TEwM6enpnHXWWdhsNk477TSGDRvGBx98ELR6w4E/bT516lQ6dOhAp06diImJ4YILLqBLly68+eabQas30gTiPdS0sKATLIPPnzYHWLRoEVdddRVXXnkljzzyCDExMcEsNyzUtc2//fZbtm3bxsSJE+nWrRvdunUD4IYbbmDSpEnBLjuk+fM8b9++PcXFxZWueb1eDO2C7xd/2nzXrl0HtbnNZiM6OjootUaigLyHBmI2Zn1dcsklxtixYw2n01k+e3bOnDkH3W7z5s3GKaecYrz33nvlMzlPOeUUY+vWrSZUHdrq2uZLliwxTj75ZOPTTz81ocrwUtc2r0qrIeqvrm2+evVq46STTjLeeustw+fzGevWrTO6dOliLFu2zISqQ1td23zmzJlGjx49jO+++87wer3GBx98YJxyyinGDz/8YELV4aO214tAvIeaGhb27NljjBkzxujevbtx+umnGw888IDh8XgMwzCMLl26GG+//Xb5bT/99FNj6NChRpcuXYzzzjvPWLFihVllh7S6tvngwYONjh07Gl26dKn0cffdd5tZfkjy53lekcJC/fnT5itWrDBGjBhhpKWlGenp6cYrr7xiVtkhra5tXlJSYsyZM8fo27evceqppxrDhw/XHyUBUPX1ItDvoTp1UkRERGql7Z5FRESkVgoLIiIiUiuFBREREamVwoKIiIjUSmFBREREaqWwICIiIrVSWBAREZFaKSyIiIhIrRQWREREpFYKCyIiIlIrhQURERGplcKCiIiI1Or/ATR+AB/cZiuBAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:41:31.741027Z",
     "start_time": "2025-06-10T05:41:31.735564Z"
    }
   },
   "source": [
    "lgb_sklearn.get_params()"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'boosting_type': 'gbdt',\n",
       " 'class_weight': None,\n",
       " 'colsample_bytree': 1.0,\n",
       " 'importance_type': 'split',\n",
       " 'learning_rate': 0.1,\n",
       " 'max_depth': -1,\n",
       " 'min_child_samples': 20,\n",
       " 'min_child_weight': 0.001,\n",
       " 'min_split_gain': 0.0,\n",
       " 'n_estimators': 100,\n",
       " 'n_jobs': None,\n",
       " 'num_leaves': 31,\n",
       " 'objective': None,\n",
       " 'random_state': 0,\n",
       " 'reg_alpha': 0.0,\n",
       " 'reg_lambda': 0.0,\n",
       " 'subsample': 1.0,\n",
       " 'subsample_for_bin': 200000,\n",
       " 'subsample_freq': 0}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 7
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 原生版本 "
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "scrolled": true,
    "ExecuteTime": {
     "end_time": "2025-06-10T05:42:32.424970Z",
     "start_time": "2025-06-10T05:42:31.187512Z"
    }
   },
   "source": [
    "import lightgbm as lgb\n",
    "import time\n",
    "\n",
    "# 准备数据集\n",
    "lgb_train = lgb.Dataset(x_train, y_train)\n",
    "lgb_test = lgb.Dataset(x_test, y_test, reference=lgb_train)\n",
    "\n",
    "# 模型参数\n",
    "lgb_origi_params = {\n",
    "    'boosting_type': 'gbdt',\n",
    "    'max_depth': -1,\n",
    "    'num_leaves': 31,\n",
    "    'bagging_fraction': 0.8,\n",
    "    'feature_fraction': 0.8,\n",
    "    'learning_rate': 0.03,\n",
    "    'metric': 'auc'\n",
    "}\n",
    "\n",
    "# 创建早停回调函数\n",
    "callbacks = [\n",
    "    lgb.early_stopping(stopping_rounds=10, verbose=True),  # 早停回合数\n",
    "    lgb.log_evaluation(period=50)  # 每50轮打印一次评估结果\n",
    "]\n",
    "\n",
    "# 训练模型\n",
    "start = time.time()\n",
    "lgb_origi = lgb.train(\n",
    "    train_set=lgb_train,\n",
    "    num_boost_round=3000,\n",
    "    params=lgb_origi_params,\n",
    "    valid_sets=[lgb_test],  # 验证集列表\n",
    "    callbacks=callbacks  # 传入早停回调\n",
    ")\n",
    "end = time.time()\n",
    "\n",
    "print(f'运行时间为{round(end-start, 0)}秒')"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.018521 seconds.\n",
      "You can set `force_col_wise=true` to remove the overhead.\n",
      "[LightGBM] [Info] Total Bins 23417\n",
      "[LightGBM] [Info] Number of data points in the train set: 22374, number of used features: 162\n",
      "[LightGBM] [Info] Start training from score 0.071959\n",
      "Training until validation scores don't improve for 10 rounds\n",
      "[50]\tvalid_0's auc: 0.707741\n",
      "[100]\tvalid_0's auc: 0.717099\n",
      "Early stopping, best iteration is:\n",
      "[130]\tvalid_0's auc: 0.720371\n",
      "运行时间为1.0秒\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:42:34.874600Z",
     "start_time": "2025-06-10T05:42:34.677480Z"
    }
   },
   "source": [
    "# 原生的lightgbm的AUC\n",
    "lgb_origi_pre = lgb_origi.predict(x_test)\n",
    "sc.plot_roc(y_test,lgb_origi_pre)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgsAAAF1CAYAAABmn6niAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABOlUlEQVR4nO3dd3xT9f7H8VfSdKUNFCiCA2WIF7UCFQRRuCqgKPOiqNf1U68DrWAZ4sIBKDhQGQqo9143CldcoAgCCnIFAQUcuBgyhCvS0kKadCU5vz9iS1va0pQ2J+P9fDx4aE+T5tNv0+ad77QYhmEgIiIiUgWr2QWIiIhIaFNYEBERkWopLIiIiEi1FBZERESkWgoLIiIiUi2FBREREamWwoKIiIhUS2FBREREqqWwICIiItWymV2AiATHu+++y3333Vfp5+Li4khJSaF9+/bccsstdOzY8bDbeDwe3nnnHRYuXMjPP/+M2+2mefPmnHHGGVx99dV06tSp2sffvn07c+fOZeXKlezevRvDMGjVqhUXX3wx1113HXa7vS6+TRGpBxZt9ywSHUrCQpcuXejSpUu5zx08eJBvv/2WjRs3YrPZePXVV+ncuXPp5/fs2cPQoUP55ZdfOO644+jevTsNGzZk165dLF++nIKCAq688koeeOAB4uLiDnvsN998k0mTJuH1ejn33HNp06YNhYWFrF27lq1bt3LyySfz+uuv07hx43pvBxEJnHoWRKJMly5dGD58eKWfmz59OjNmzGDy5MnMnTsXAKfTyfXXX8+uXbvIzMzk1ltvxWY79Kdj//79jB49mrlz55Kfn8/kyZPLfc0PPviA8ePHc9JJJzFr1izatGlT+jmfz8e0adN4/vnnue222/jPf/5TD9+xiBwtzVkQkVK33XYbsbGxbNy4kfz8fACmTZvGzp07GTp0KBkZGeWCAkDjxo158cUXadu2LfPnz2fFihWlnzt48CCPPPIIsbGx/Pvf/y4XFACsVisjR47kzDPP5JtvvuHzzz+v/29SRAKmsCAipeLi4khOTgagqKgIt9vNvHnzsNvt3HLLLVXeLzY2lhEjRgDw1ltvlV5fvHgxTqeTAQMG0KJFiyrvP3r0aMaNG8fJJ59cN9+IiNQpDUOISKnvv/+enJwcmjdvTsOGDVm1ahX5+fl07969NERUpUePHiQkJPDf//6XgoICEhISWLlyZennqtO5c+dycyREJLSoZ0EkyhmGwYEDB/j000/JzMwE4I477gDg119/BaBVq1ZH/Drx8fEcd9xxFBcXs3fvXgD+97//AdCyZct6qFxEgkU9CyJR5rnnnuO5556r9HPJycmMGTOGK664AvBPbgRISkqq0ddu2LAh4J/0eNJJJ3Hw4MGA7i8ioUlhQSTKlF066Xa7WbhwIb///jsDBw7kkUceISEhofS2DocDgMLCwhp9bbfbDUCjRo1K/7t9+3YOHDhQl9+CiASZwoJIlKm4dHLYsGEMHTqU+fPn07BhQx544IHSz5VMSty+ffsRv67H42Hnzp3YbDaaN28OwAknnMCGDRvYuXMn7du3r/K+hYWF7N+/n2OPPbaW35WI1CfNWRCJcklJSUydOpXU1FRef/31cnsddO3aleTkZNasWVM6JFGVL774gvz8fM4555zS3omSiY1ffPFFtfddunQp559/Pvfcc89RfjciUh8UFkSE1NRUxo0bB8Bjjz3G7t27Af+kxSFDhuB2u5k+fXqV9y8uLmbatGkA/P3vfy+93rNnT1JSUliwYAG7du2q9L5er5fZs2cD0K1bt7r4dkSkjiksiAgAF154IRdddBFut5vx48eXXh8xYgQtW7bktddeY9q0aXg8nnL3y8nJYfjw4WzatIn+/fvTq1ev0s85HA5GjBhBcXExN998M9u2bSt338LCQh555BG+/vpr0tLSGDBgQP1+kyJSK5qzICKlHnjgAVatWsWKFSv46KOP6NevH4mJibz++uvccccdzJw5kw8++IDu3buTkpLC7t27WbFiBU6nk0svvZSHH374sK951VVX8ccffzBz5kz69+9P9+7dOfnkk8nJyeHLL79kz549tG7dmhkzZhATE2PCdy0iR6KDpESiRMlBUsOGDavybAiAN954g0ceeYTU1FQWLlxYuhyyuLiYxYsX884777B161Zyc3M55phj6NChA1deeeVhh1NVtHHjRt544w2+//579u7di2EYtG7dmksuuYTrrruu3CoMEQktCgsiIiJSLc1ZEBERkWopLIiIiEi1FBZERESkWrUOC/v37+fCCy9kzZo1Vd5mxYoVDBgwgI4dO3LJJZfw2Wef1fbhRERExCS1Cgtff/01V155JTt37qzyNtu3b2f48OFkZmby1VdfMXz4cEaMGFF6Gp2IiIiE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VFTumtfrxdAu+AEJpM337NlzWJvbbDZiY2ODUms0qpPX0LqYjVlbV111lTFy5EjD6XSWzp6dPn36YbfbsmWLccYZZxgfffRR6UzOM844w9i2bZsJVYe3mrb5okWLjNNPP934/PPPTagystS0zSvSaojaq2mbr1q1yjjttNOM999/3/D5fMbatWuNjh07GkuXLjWh6vBW0zafMmWK0bVrV+P77783vF6v8fHHHxtnnHGG8cMPP5hQdeSo7u9FXbyGmhoW9u3bZwwfPtzo0qWLcfbZZxuPP/644fF4DMMwjI4dOxoffPBB6W0///xzY+DAgUbHjh2Nfv36GcuXLzer7LBW0zbv37+/0a5dO6Njx47l/j344INmlh+WAnmel6WwUHuBtPny5cuNSy+91EhPTzd69eplvPXWW2aVHdZq2ubFxcXG9OnTjQsuuMA488wzjcGDB+tNSR2o+Peirl9DdeqkiIiIVEvbPYuIiEi1FBZERESkWgoLIiIiUi2FBREREamWwoKIiIhUS2FBREREqqWwICIiItVSWBAREZFqKSyIiIhItRQWREREpFoKCyIiIlIthQURERGp1v8DIberjf7F8SAAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 10
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 调参"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:46:13.593793Z",
     "start_time": "2025-06-10T05:46:09.347935Z"
    }
   },
   "source": [
    "import lightgbm as lgb\n",
    "\n",
    "# 准备数据集\n",
    "lgb_train = lgb.Dataset(x_train, y_train)\n",
    "\n",
    "# 模型参数\n",
    "base_parmas = {\n",
    "    'boosting_type': 'gbdt',\n",
    "    'learning_rate': 0.03,\n",
    "    'num_leaves': 40,\n",
    "    'max_depth': -1,\n",
    "    'bagging_fraction': 0.8,\n",
    "    'feature_fraction': 0.8,\n",
    "    'lambda_l1': 0,\n",
    "    'lambda_l2': 0,\n",
    "    'min_data_in_leaf': 20,\n",
    "    'min_sum_hessian_inleaf': 0.001,\n",
    "    'metric': 'auc',  # 显式设置评估指标\n",
    "    'verbose': -1\n",
    "}\n",
    "\n",
    "# 交叉验证\n",
    "cv_result = lgb.cv(\n",
    "    params=base_parmas,\n",
    "    train_set=lgb_train,\n",
    "    num_boost_round=200,\n",
    "    nfold=5,\n",
    "    stratified=True,\n",
    "    shuffle=True,\n",
    "    seed=0,\n",
    "    callbacks=[lgb.early_stopping(5)]\n",
    ")\n",
    "\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training until validation scores don't improve for 5 rounds\n",
      "Early stopping, best iteration is:\n",
      "[157]\tvalid's auc: 0.731466 + 0.00631998\n"
     ]
    }
   ],
   "execution_count": 15
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:46:15.725252Z",
     "start_time": "2025-06-10T05:46:15.718627Z"
    }
   },
   "source": [
    "# 调试：打印所有可用的键\n",
    "print(\"交叉验证结果的键:\", cv_result.keys())\n",
    "\n",
    "# 动态查找 AUC 指标的键\n",
    "auc_key = next((k for k in cv_result.keys() if 'auc' in k.lower() and 'mean' in k.lower()), None)\n",
    "if auc_key:\n",
    "    best_iteration = len(cv_result[auc_key])\n",
    "    best_auc = cv_result[auc_key][-1]\n",
    "    print(f\"最佳迭代次数: {best_iteration}\")\n",
    "    print(f\"交叉验证 AUC: {best_auc:.6f}\")\n",
    "else:\n",
    "    print(\"错误：未找到 AUC 相关的评估结果！\")\n",
    "    print(\"可用结果:\", cv_result)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "交叉验证结果的键: dict_keys(['valid auc-mean', 'valid auc-stdv'])\n",
      "最佳迭代次数: 157\n",
      "交叉验证 AUC: 0.731466\n"
     ]
    }
   ],
   "execution_count": 16
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:46:41.038477Z",
     "start_time": "2025-06-10T05:46:19.774783Z"
    }
   },
   "source": [
    "# num_leaves ，步长设为5\n",
    "param_find1 = {'num_leaves':range(30,100,10)}\n",
    "cv_fold = StratifiedKFold(n_splits=5,random_state=0,shuffle=True)\n",
    "start = time.time()\n",
    "grid_search1 = GridSearchCV(estimator=lgb.LGBMClassifier(learning_rate=0.1,\n",
    "                                                         n_estimators = 51,\n",
    "                                                         max_depth=-1,\n",
    "                                                         min_child_weight=0.001,\n",
    "                                                         min_child_samples=20,\n",
    "                                                         subsample=0.8,\n",
    "                                                         colsample_bytree=0.8,\n",
    "                                                         reg_lambda=0,\n",
    "                                                         reg_alpha=0),\n",
    "                             cv = cv_fold,\n",
    "                             n_jobs=-1,\n",
    "                             param_grid = param_find1,\n",
    "                             scoring='roc_auc')\n",
    "grid_search1.fit(x_train,y_train)\n",
    "end = time.time()\n",
    "print('运行时间为:{}'.format(round(end-start,0)))"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "运行时间为:21.0\n"
     ]
    }
   ],
   "execution_count": 17
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:47:02.907064Z",
     "start_time": "2025-06-10T05:47:02.901405Z"
    }
   },
   "source": [
    "print(grid_search1.best_score_)\n",
    "print('\\t')\n",
    "print(grid_search1.best_params_)\n",
    "print('\\t')\n",
    "print(grid_search1.best_score_)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7280717770047074\n",
      "\t\n",
      "{'num_leaves': 70}\n",
      "\t\n",
      "0.7280717770047074\n"
     ]
    }
   ],
   "execution_count": 18
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:47:15.117385Z",
     "start_time": "2025-06-10T05:47:07.158990Z"
    }
   },
   "source": [
    "# num_leaves,步长设为2 \n",
    "param_find2 = {'num_leaves':range(16,64,16)}\n",
    "grid_search2 = GridSearchCV(estimator=lgb.LGBMClassifier(estimator=51,\n",
    "                                                         learning_rate=0.1,\n",
    "                                                         min_child_weight=0.001,\n",
    "                                                         min_child_samples=20,\n",
    "                                                         subsample=0.8,\n",
    "                                                         colsample_bytree=0.8,\n",
    "                                                         reg_lambda=0,\n",
    "                                                         reg_alpha=0\n",
    "                                                         ),\n",
    "                            cv=cv_fold,\n",
    "                            n_jobs=-1,\n",
    "                            scoring='roc_auc',\n",
    "                            param_grid = param_find2)\n",
    "grid_search2.fit(x_train,y_train)\n",
    "print(grid_search2.best_score_)\n",
    "print('\\t')\n",
    "print(grid_search2.best_params_)\n",
    "print('\\t')\n",
    "print(grid_search2.best_score_)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7294400810041994\n",
      "\t\n",
      "{'num_leaves': 32}\n",
      "\t\n",
      "0.7294400810041994\n"
     ]
    }
   ],
   "execution_count": 19
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:49:24.672049Z",
     "start_time": "2025-06-10T05:49:00.232969Z"
    }
   },
   "source": [
    "# 确定num_leaves 为30 ，下面进行min_child_samples 和 min_child_weight的调参，设定步长为5\n",
    "param_find3 = {'min_child_samples':range(15,35,5),\n",
    "               'min_child_weight':[x/1000 for x in range(1,4,1)]}\n",
    "grid_search3 = GridSearchCV(estimator=lgb.LGBMClassifier(estimator=51,\n",
    "                                                         learning_rate=0.1,\n",
    "                                                         num_leaves=30,\n",
    "                                                         subsample=0.8,\n",
    "                                                         colsample_bytree=0.8,\n",
    "                                                         reg_lambda=0,\n",
    "                                                         reg_alpha=0\n",
    "                                                         ),\n",
    "                            cv=cv_fold,\n",
    "                            scoring='roc_auc',\n",
    "                            param_grid = param_find3,\n",
    "                            n_jobs=-1)\n",
    "start = time.time()\n",
    "grid_search3.fit(x_train,y_train)\n",
    "end = time.time()\n",
    "print('运行时间:{} 秒'.format(round(end-start,0)))\n",
    "print(grid_search3.cv_results_)\n",
    "print('\\t')\n",
    "print(grid_search3.best_params_)\n",
    "print('\\t')\n",
    "print(grid_search3.best_score_)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "运行时间:24.0 秒\n",
      "{'mean_fit_time': array([6.50611205, 6.70279584, 6.93532763, 6.25095158, 6.68522363,\n",
      "       6.53844862, 6.62438631, 5.90857005, 6.27064056, 5.87997899,\n",
      "       4.84665022, 3.41802516]), 'std_fit_time': array([0.51518993, 0.43939904, 0.24040432, 0.42822572, 0.99149599,\n",
      "       0.67539207, 0.85285347, 0.37854624, 0.34944774, 0.42154075,\n",
      "       0.34191628, 0.45174103]), 'mean_score_time': array([0.02963762, 0.02431812, 0.03783636, 0.02192559, 0.03346071,\n",
      "       0.03181996, 0.02211576, 0.02084656, 0.02282901, 0.02063189,\n",
      "       0.01913576, 0.01638908]), 'std_score_time': array([0.01719087, 0.00432448, 0.01663819, 0.00276873, 0.01933477,\n",
      "       0.00896125, 0.00717078, 0.00295357, 0.00223748, 0.00275702,\n",
      "       0.00233   , 0.0013515 ]), 'param_min_child_samples': masked_array(data=[15, 15, 15, 20, 20, 20, 25, 25, 25, 30, 30, 30],\n",
      "             mask=[False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False],\n",
      "       fill_value='?',\n",
      "            dtype=object), 'param_min_child_weight': masked_array(data=[0.001, 0.002, 0.003, 0.001, 0.002, 0.003, 0.001, 0.002,\n",
      "                   0.003, 0.001, 0.002, 0.003],\n",
      "             mask=[False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False],\n",
      "       fill_value='?',\n",
      "            dtype=object), 'params': [{'min_child_samples': 15, 'min_child_weight': 0.001}, {'min_child_samples': 15, 'min_child_weight': 0.002}, {'min_child_samples': 15, 'min_child_weight': 0.003}, {'min_child_samples': 20, 'min_child_weight': 0.001}, {'min_child_samples': 20, 'min_child_weight': 0.002}, {'min_child_samples': 20, 'min_child_weight': 0.003}, {'min_child_samples': 25, 'min_child_weight': 0.001}, {'min_child_samples': 25, 'min_child_weight': 0.002}, {'min_child_samples': 25, 'min_child_weight': 0.003}, {'min_child_samples': 30, 'min_child_weight': 0.001}, {'min_child_samples': 30, 'min_child_weight': 0.002}, {'min_child_samples': 30, 'min_child_weight': 0.003}], 'split0_test_score': array([0.7146125 , 0.7146125 , 0.7146125 , 0.70953199, 0.70953199,\n",
      "       0.70953199, 0.71398585, 0.71398585, 0.71398585, 0.72318447,\n",
      "       0.72318447, 0.72318447]), 'split1_test_score': array([0.71718641, 0.71718641, 0.71718641, 0.72994528, 0.72994528,\n",
      "       0.72994528, 0.72697429, 0.72697429, 0.72697429, 0.71603032,\n",
      "       0.71603032, 0.71603032]), 'split2_test_score': array([0.71943428, 0.71943428, 0.71943428, 0.71611108, 0.71611108,\n",
      "       0.71611108, 0.73045228, 0.73045228, 0.73045228, 0.7209867 ,\n",
      "       0.7209867 , 0.7209867 ]), 'split3_test_score': array([0.733685  , 0.733685  , 0.733685  , 0.73988645, 0.73988645,\n",
      "       0.73988645, 0.74499838, 0.74499838, 0.74499838, 0.74892505,\n",
      "       0.74892505, 0.74892505]), 'split4_test_score': array([0.72791979, 0.72791979, 0.72791979, 0.71797173, 0.71797173,\n",
      "       0.71797173, 0.72617552, 0.72617552, 0.72617552, 0.72360847,\n",
      "       0.72360847, 0.72360847]), 'mean_test_score': array([0.7225676 , 0.7225676 , 0.7225676 , 0.72268931, 0.72268931,\n",
      "       0.72268931, 0.72851726, 0.72851726, 0.72851726, 0.726547  ,\n",
      "       0.726547  , 0.726547  ]), 'std_test_score': array([0.00713163, 0.00713163, 0.00713163, 0.01083545, 0.01083545,\n",
      "       0.01083545, 0.00994382, 0.00994382, 0.00994382, 0.01150857,\n",
      "       0.01150857, 0.01150857]), 'rank_test_score': array([10, 10, 10,  7,  7,  7,  1,  1,  1,  4,  4,  4])}\n",
      "\t\n",
      "{'min_child_samples': 25, 'min_child_weight': 0.001}\n",
      "\t\n",
      "0.7285172626113843\n"
     ]
    }
   ],
   "execution_count": 21
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:51:49.795450Z",
     "start_time": "2025-06-10T05:50:45.199315Z"
    }
   },
   "source": [
    "# 确定min_child_weight为0.001，min_child_samples为20,下面对subsample和colsample_bytree进行调参\n",
    "param_find4 = {'subsample':[x/10 for x in range(5,11,1)],\n",
    "               'colsample_bytree':[x/10 for x in range(5,11,1)]}\n",
    "grid_search4 = GridSearchCV(estimator=lgb.LGBMClassifier(estimator=51,\n",
    "                                                         learning_rate=0.1,\n",
    "                                                         min_child_samples=20,\n",
    "                                                         min_child_weight=0.001,\n",
    "                                                         num_leaves=30,\n",
    "                                                         subsample=0.8,\n",
    "                                                         colsample_bytree=0.8,\n",
    "                                                         reg_lambda=0,\n",
    "                                                         reg_alpha=0\n",
    "                                                         ),\n",
    "                            cv=cv_fold,\n",
    "                            scoring='roc_auc',\n",
    "                            param_grid = param_find4,\n",
    "                            n_jobs=-1)\n",
    "start = time.time()\n",
    "grid_search4.fit(x_train,y_train)\n",
    "end = time.time()\n",
    "print('运行时间:{} 秒'.format(round(end-start,0)))\n",
    "print(grid_search4.cv_results_)\n",
    "print('\\t')\n",
    "print(grid_search4.best_params_)\n",
    "print('\\t')\n",
    "print(grid_search4.best_score_)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "运行时间:65.0 秒\n",
      "{'mean_fit_time': array([5.11719785, 5.99978447, 5.96671467, 4.451402  , 4.32493014,\n",
      "       5.35542364, 4.81094642, 4.53918839, 5.18424144, 5.08803   ,\n",
      "       4.84005594, 5.7853044 , 5.15332727, 5.12963285, 5.32155404,\n",
      "       5.38909745, 5.12335539, 5.7680408 , 5.6406888 , 6.2617856 ,\n",
      "       5.9741004 , 5.51625614, 5.65466328, 5.91840992, 5.86058106,\n",
      "       5.95055146, 6.10921388, 5.79431362, 6.03655663, 6.16224675,\n",
      "       6.23461113, 6.2664485 , 6.69247971, 6.56823692, 5.48941417,\n",
      "       4.18175888]), 'std_fit_time': array([0.37268551, 0.93211165, 1.01127781, 0.79766096, 0.37205327,\n",
      "       0.28571153, 0.42353936, 0.12325562, 0.36645585, 0.35264583,\n",
      "       0.05342062, 0.41805556, 0.47503004, 0.41021732, 0.38276166,\n",
      "       0.31729017, 0.33155557, 0.56178624, 0.31108263, 0.43559504,\n",
      "       0.56448675, 0.33242493, 0.32691593, 0.19787526, 0.0975347 ,\n",
      "       0.10450222, 0.18561434, 0.2455706 , 0.29268401, 0.26298138,\n",
      "       0.2955142 , 0.37399558, 0.43459036, 0.39849949, 0.41859138,\n",
      "       0.29830947]), 'mean_score_time': array([0.02572675, 0.02020488, 0.02181268, 0.02162356, 0.03004866,\n",
      "       0.02302322, 0.02043018, 0.02551312, 0.02121229, 0.01956153,\n",
      "       0.0331337 , 0.03121505, 0.0192193 , 0.02712688, 0.02153516,\n",
      "       0.02261219, 0.02782135, 0.02125454, 0.02002406, 0.01951733,\n",
      "       0.0175076 , 0.02033558, 0.01813183, 0.02301269, 0.0189177 ,\n",
      "       0.0197207 , 0.0192215 , 0.01941109, 0.01822371, 0.02001114,\n",
      "       0.02332234, 0.02041864, 0.02304516, 0.01811657, 0.01832161,\n",
      "       0.01833086]), 'std_score_time': array([0.01132258, 0.00306069, 0.00171701, 0.00262676, 0.02013668,\n",
      "       0.00311759, 0.00167308, 0.00784834, 0.00344043, 0.00351703,\n",
      "       0.0184977 , 0.01807929, 0.00205756, 0.0110186 , 0.00700345,\n",
      "       0.00451189, 0.01920422, 0.00690837, 0.00253121, 0.00265921,\n",
      "       0.00119542, 0.00259636, 0.00214178, 0.01001739, 0.00310356,\n",
      "       0.00346884, 0.00221892, 0.0021627 , 0.0026441 , 0.00289425,\n",
      "       0.00869015, 0.00679602, 0.00494128, 0.00174547, 0.00192744,\n",
      "       0.00215734]), 'param_colsample_bytree': masked_array(data=[0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.6, 0.6, 0.6, 0.6, 0.6,\n",
      "                   0.6, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, 0.8, 0.8, 0.8, 0.8,\n",
      "                   0.8, 0.8, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 1.0, 1.0, 1.0,\n",
      "                   1.0, 1.0, 1.0],\n",
      "             mask=[False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False],\n",
      "       fill_value='?',\n",
      "            dtype=object), 'param_subsample': masked_array(data=[0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0.5, 0.6, 0.7, 0.8, 0.9,\n",
      "                   1.0, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0.5, 0.6, 0.7, 0.8,\n",
      "                   0.9, 1.0, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 0.5, 0.6, 0.7,\n",
      "                   0.8, 0.9, 1.0],\n",
      "             mask=[False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False],\n",
      "       fill_value='?',\n",
      "            dtype=object), 'params': [{'colsample_bytree': 0.5, 'subsample': 0.5}, {'colsample_bytree': 0.5, 'subsample': 0.6}, {'colsample_bytree': 0.5, 'subsample': 0.7}, {'colsample_bytree': 0.5, 'subsample': 0.8}, {'colsample_bytree': 0.5, 'subsample': 0.9}, {'colsample_bytree': 0.5, 'subsample': 1.0}, {'colsample_bytree': 0.6, 'subsample': 0.5}, {'colsample_bytree': 0.6, 'subsample': 0.6}, {'colsample_bytree': 0.6, 'subsample': 0.7}, {'colsample_bytree': 0.6, 'subsample': 0.8}, {'colsample_bytree': 0.6, 'subsample': 0.9}, {'colsample_bytree': 0.6, 'subsample': 1.0}, {'colsample_bytree': 0.7, 'subsample': 0.5}, {'colsample_bytree': 0.7, 'subsample': 0.6}, {'colsample_bytree': 0.7, 'subsample': 0.7}, {'colsample_bytree': 0.7, 'subsample': 0.8}, {'colsample_bytree': 0.7, 'subsample': 0.9}, {'colsample_bytree': 0.7, 'subsample': 1.0}, {'colsample_bytree': 0.8, 'subsample': 0.5}, {'colsample_bytree': 0.8, 'subsample': 0.6}, {'colsample_bytree': 0.8, 'subsample': 0.7}, {'colsample_bytree': 0.8, 'subsample': 0.8}, {'colsample_bytree': 0.8, 'subsample': 0.9}, {'colsample_bytree': 0.8, 'subsample': 1.0}, {'colsample_bytree': 0.9, 'subsample': 0.5}, {'colsample_bytree': 0.9, 'subsample': 0.6}, {'colsample_bytree': 0.9, 'subsample': 0.7}, {'colsample_bytree': 0.9, 'subsample': 0.8}, {'colsample_bytree': 0.9, 'subsample': 0.9}, {'colsample_bytree': 0.9, 'subsample': 1.0}, {'colsample_bytree': 1.0, 'subsample': 0.5}, {'colsample_bytree': 1.0, 'subsample': 0.6}, {'colsample_bytree': 1.0, 'subsample': 0.7}, {'colsample_bytree': 1.0, 'subsample': 0.8}, {'colsample_bytree': 1.0, 'subsample': 0.9}, {'colsample_bytree': 1.0, 'subsample': 1.0}], 'split0_test_score': array([0.72059336, 0.72059336, 0.72059336, 0.72059336, 0.72059336,\n",
      "       0.72059336, 0.7128851 , 0.7128851 , 0.7128851 , 0.7128851 ,\n",
      "       0.7128851 , 0.7128851 , 0.73008137, 0.73008137, 0.73008137,\n",
      "       0.73008137, 0.73008137, 0.73008137, 0.70953199, 0.70953199,\n",
      "       0.70953199, 0.70953199, 0.70953199, 0.70953199, 0.71301596,\n",
      "       0.71301596, 0.71301596, 0.71301596, 0.71301596, 0.71301596,\n",
      "       0.71347062, 0.71347062, 0.71347062, 0.71347062, 0.71347062,\n",
      "       0.71347062]), 'split1_test_score': array([0.71645207, 0.71645207, 0.71645207, 0.71645207, 0.71645207,\n",
      "       0.71645207, 0.71570652, 0.71570652, 0.71570652, 0.71570652,\n",
      "       0.71570652, 0.71570652, 0.72808402, 0.72808402, 0.72808402,\n",
      "       0.72808402, 0.72808402, 0.72808402, 0.72994528, 0.72994528,\n",
      "       0.72994528, 0.72994528, 0.72994528, 0.72994528, 0.71838363,\n",
      "       0.71838363, 0.71838363, 0.71838363, 0.71838363, 0.71838363,\n",
      "       0.70955965, 0.70955965, 0.70955965, 0.70955965, 0.70955965,\n",
      "       0.70955965]), 'split2_test_score': array([0.7232398 , 0.7232398 , 0.7232398 , 0.7232398 , 0.7232398 ,\n",
      "       0.7232398 , 0.7263267 , 0.7263267 , 0.7263267 , 0.7263267 ,\n",
      "       0.7263267 , 0.7263267 , 0.72288385, 0.72288385, 0.72288385,\n",
      "       0.72288385, 0.72288385, 0.72288385, 0.71611108, 0.71611108,\n",
      "       0.71611108, 0.71611108, 0.71611108, 0.71611108, 0.72344096,\n",
      "       0.72344096, 0.72344096, 0.72344096, 0.72344096, 0.72344096,\n",
      "       0.71356559, 0.71356559, 0.71356559, 0.71356559, 0.71356559,\n",
      "       0.71356559]), 'split3_test_score': array([0.73406413, 0.73406413, 0.73406413, 0.73406413, 0.73406413,\n",
      "       0.73406413, 0.74430218, 0.74430218, 0.74430218, 0.74430218,\n",
      "       0.74430218, 0.74430218, 0.74519879, 0.74519879, 0.74519879,\n",
      "       0.74519879, 0.74519879, 0.74519879, 0.73988645, 0.73988645,\n",
      "       0.73988645, 0.73988645, 0.73988645, 0.73988645, 0.74012276,\n",
      "       0.74012276, 0.74012276, 0.74012276, 0.74012276, 0.74012276,\n",
      "       0.7406335 , 0.7406335 , 0.7406335 , 0.7406335 , 0.7406335 ,\n",
      "       0.7406335 ]), 'split4_test_score': array([0.72345214, 0.72345214, 0.72345214, 0.72345214, 0.72345214,\n",
      "       0.72345214, 0.72514705, 0.72514705, 0.72514705, 0.72514705,\n",
      "       0.72514705, 0.72514705, 0.72258075, 0.72258075, 0.72258075,\n",
      "       0.72258075, 0.72258075, 0.72258075, 0.71797173, 0.71797173,\n",
      "       0.71797173, 0.71797173, 0.71797173, 0.71797173, 0.72624433,\n",
      "       0.72624433, 0.72624433, 0.72624433, 0.72624433, 0.72624433,\n",
      "       0.7341018 , 0.7341018 , 0.7341018 , 0.7341018 , 0.7341018 ,\n",
      "       0.7341018 ]), 'mean_test_score': array([0.7235603 , 0.7235603 , 0.7235603 , 0.7235603 , 0.7235603 ,\n",
      "       0.7235603 , 0.72487351, 0.72487351, 0.72487351, 0.72487351,\n",
      "       0.72487351, 0.72487351, 0.72976576, 0.72976576, 0.72976576,\n",
      "       0.72976576, 0.72976576, 0.72976576, 0.72268931, 0.72268931,\n",
      "       0.72268931, 0.72268931, 0.72268931, 0.72268931, 0.72424153,\n",
      "       0.72424153, 0.72424153, 0.72424153, 0.72424153, 0.72424153,\n",
      "       0.72226623, 0.72226623, 0.72226623, 0.72226623, 0.72226623,\n",
      "       0.72226623]), 'std_test_score': array([0.00582708, 0.00582708, 0.00582708, 0.00582708, 0.00582708,\n",
      "       0.00582708, 0.01102194, 0.01102194, 0.01102194, 0.01102194,\n",
      "       0.01102194, 0.01102194, 0.00824732, 0.00824732, 0.00824732,\n",
      "       0.00824732, 0.00824732, 0.00824732, 0.01083545, 0.01083545,\n",
      "       0.01083545, 0.01083545, 0.01083545, 0.01083545, 0.00913448,\n",
      "       0.00913448, 0.00913448, 0.00913448, 0.00913448, 0.00913448,\n",
      "       0.01258538, 0.01258538, 0.01258538, 0.01258538, 0.01258538,\n",
      "       0.01258538]), 'rank_test_score': array([19, 19, 19, 19, 19, 19,  7,  7,  7,  7,  7,  7,  1,  1,  1,  1,  1,\n",
      "        1, 25, 25, 25, 25, 25, 25, 13, 13, 13, 13, 13, 13, 31, 31, 31, 31,\n",
      "       31, 31])}\n",
      "\t\n",
      "{'colsample_bytree': 0.7, 'subsample': 0.5}\n",
      "\t\n",
      "0.7297657565513409\n"
     ]
    }
   ],
   "execution_count": 23
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:53:09.495719Z",
     "start_time": "2025-06-10T05:52:02.231272Z"
    }
   },
   "source": [
    "param_find5 = {'reg_lambda':[0.001,0.01,0.03,0.08,0.1,0.3],\n",
    "               'reg_alpha':[0.001,0.01,0.03,0.08,0.1,0.3]}\n",
    "grid_search5 = GridSearchCV(estimator=lgb.LGBMClassifier(estimator=51,\n",
    "                                                         learning_rate=0.1,\n",
    "                                                         min_child_samples=20,\n",
    "                                                         min_child_weight=0.001,\n",
    "                                                         num_leaves=30,\n",
    "                                                         subsample=0.5,\n",
    "                                                         colsample_bytree=0.6,\n",
    "                                                         ),\n",
    "                            cv=cv_fold,\n",
    "                            scoring='roc_auc',\n",
    "                            param_grid = param_find5,\n",
    "                            n_jobs=-1)\n",
    "start = time.time()\n",
    "grid_search5.fit(x_train,y_train)\n",
    "end = time.time()\n",
    "print('运行时间:{} 秒'.format(round(end-start,0)))\n",
    "print(grid_search5.cv_results_)\n",
    "print('\\t')\n",
    "print(grid_search5.best_params_)\n",
    "print('\\t')\n",
    "print(grid_search5.best_score_)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "运行时间:67.0 秒\n",
      "{'mean_fit_time': array([7.26780438, 6.13654552, 6.59210362, 5.26998024, 5.4936018 ,\n",
      "       5.78706841, 5.59640546, 5.54647603, 5.71027498, 5.2458643 ,\n",
      "       4.82688813, 5.37319393, 5.3692843 , 5.08782268, 5.40532746,\n",
      "       5.64137816, 5.32215004, 6.13176064, 6.16251454, 5.42904501,\n",
      "       4.2214951 , 5.06480513, 5.97414155, 6.08824596, 6.67331133,\n",
      "       6.66518011, 6.69173279, 5.76728315, 4.67437387, 6.09118371,\n",
      "       6.73126836, 6.43554306, 6.06200976, 5.4183548 , 5.35961981,\n",
      "       3.74469314]), 'std_fit_time': array([1.03957595, 0.49206846, 0.98821009, 1.01039182, 0.6120915 ,\n",
      "       0.49217064, 0.37401067, 0.35351238, 0.27425181, 0.32085509,\n",
      "       0.04198351, 0.13560784, 0.13897382, 0.05202228, 0.42220072,\n",
      "       0.26516922, 0.48548692, 0.96574348, 0.50536513, 0.44343945,\n",
      "       0.91456631, 2.19673608, 0.82991811, 0.42729697, 0.59654644,\n",
      "       0.49473258, 0.57949165, 0.69436906, 0.95537827, 2.32134754,\n",
      "       0.37194575, 0.4888304 , 0.53389761, 0.57907965, 0.49026947,\n",
      "       1.20797217]), 'mean_score_time': array([0.02583504, 0.02395892, 0.02071638, 0.02322106, 0.02341352,\n",
      "       0.02411537, 0.02080493, 0.02043777, 0.01982355, 0.01812325,\n",
      "       0.01873312, 0.02149363, 0.02320614, 0.01947069, 0.01980553,\n",
      "       0.02251186, 0.0188273 , 0.30995941, 0.32040062, 0.36281891,\n",
      "       0.85324116, 0.12728477, 0.02221699, 0.02902055, 0.29132328,\n",
      "       0.34317074, 0.95508704, 0.02891955, 0.02012477, 0.01892724,\n",
      "       0.020713  , 0.02863584, 0.02096744, 0.0171247 , 0.01670671,\n",
      "       0.0181232 ]), 'std_score_time': array([0.00674742, 0.00631746, 0.0016059 , 0.00254171, 0.00746935,\n",
      "       0.00462981, 0.00318753, 0.00243499, 0.00230823, 0.00264375,\n",
      "       0.00294762, 0.0020409 , 0.00870304, 0.00226624, 0.00213386,\n",
      "       0.0048763 , 0.00245705, 0.5836527 , 0.36991611, 0.45135839,\n",
      "       0.48621165, 0.21216226, 0.00386788, 0.00943091, 0.31978031,\n",
      "       0.64358693, 0.7663699 , 0.01791529, 0.00289747, 0.00279433,\n",
      "       0.0032832 , 0.01384756, 0.00238238, 0.00270169, 0.00193587,\n",
      "       0.00196917]), 'param_reg_alpha': masked_array(data=[0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.01, 0.01,\n",
      "                   0.01, 0.01, 0.01, 0.01, 0.03, 0.03, 0.03, 0.03, 0.03,\n",
      "                   0.03, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.1, 0.1,\n",
      "                   0.1, 0.1, 0.1, 0.1, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3],\n",
      "             mask=[False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False],\n",
      "       fill_value='?',\n",
      "            dtype=object), 'param_reg_lambda': masked_array(data=[0.001, 0.01, 0.03, 0.08, 0.1, 0.3, 0.001, 0.01, 0.03,\n",
      "                   0.08, 0.1, 0.3, 0.001, 0.01, 0.03, 0.08, 0.1, 0.3,\n",
      "                   0.001, 0.01, 0.03, 0.08, 0.1, 0.3, 0.001, 0.01, 0.03,\n",
      "                   0.08, 0.1, 0.3, 0.001, 0.01, 0.03, 0.08, 0.1, 0.3],\n",
      "             mask=[False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False, False, False, False, False,\n",
      "                   False, False, False, False],\n",
      "       fill_value='?',\n",
      "            dtype=object), 'params': [{'reg_alpha': 0.001, 'reg_lambda': 0.001}, {'reg_alpha': 0.001, 'reg_lambda': 0.01}, {'reg_alpha': 0.001, 'reg_lambda': 0.03}, {'reg_alpha': 0.001, 'reg_lambda': 0.08}, {'reg_alpha': 0.001, 'reg_lambda': 0.1}, {'reg_alpha': 0.001, 'reg_lambda': 0.3}, {'reg_alpha': 0.01, 'reg_lambda': 0.001}, {'reg_alpha': 0.01, 'reg_lambda': 0.01}, {'reg_alpha': 0.01, 'reg_lambda': 0.03}, {'reg_alpha': 0.01, 'reg_lambda': 0.08}, {'reg_alpha': 0.01, 'reg_lambda': 0.1}, {'reg_alpha': 0.01, 'reg_lambda': 0.3}, {'reg_alpha': 0.03, 'reg_lambda': 0.001}, {'reg_alpha': 0.03, 'reg_lambda': 0.01}, {'reg_alpha': 0.03, 'reg_lambda': 0.03}, {'reg_alpha': 0.03, 'reg_lambda': 0.08}, {'reg_alpha': 0.03, 'reg_lambda': 0.1}, {'reg_alpha': 0.03, 'reg_lambda': 0.3}, {'reg_alpha': 0.08, 'reg_lambda': 0.001}, {'reg_alpha': 0.08, 'reg_lambda': 0.01}, {'reg_alpha': 0.08, 'reg_lambda': 0.03}, {'reg_alpha': 0.08, 'reg_lambda': 0.08}, {'reg_alpha': 0.08, 'reg_lambda': 0.1}, {'reg_alpha': 0.08, 'reg_lambda': 0.3}, {'reg_alpha': 0.1, 'reg_lambda': 0.001}, {'reg_alpha': 0.1, 'reg_lambda': 0.01}, {'reg_alpha': 0.1, 'reg_lambda': 0.03}, {'reg_alpha': 0.1, 'reg_lambda': 0.08}, {'reg_alpha': 0.1, 'reg_lambda': 0.1}, {'reg_alpha': 0.1, 'reg_lambda': 0.3}, {'reg_alpha': 0.3, 'reg_lambda': 0.001}, {'reg_alpha': 0.3, 'reg_lambda': 0.01}, {'reg_alpha': 0.3, 'reg_lambda': 0.03}, {'reg_alpha': 0.3, 'reg_lambda': 0.08}, {'reg_alpha': 0.3, 'reg_lambda': 0.1}, {'reg_alpha': 0.3, 'reg_lambda': 0.3}], 'split0_test_score': array([0.71365757, 0.71324404, 0.71461624, 0.73237336, 0.71510829,\n",
      "       0.71582393, 0.72142416, 0.71727315, 0.73241001, 0.71871939,\n",
      "       0.71411896, 0.72572996, 0.72089472, 0.7223933 , 0.72774153,\n",
      "       0.7270371 , 0.71733148, 0.72599842, 0.71533263, 0.71014742,\n",
      "       0.72892828, 0.7153573 , 0.72216074, 0.70942954, 0.72229908,\n",
      "       0.71530122, 0.71299053, 0.72874357, 0.74005994, 0.7265129 ,\n",
      "       0.71754759, 0.73083366, 0.72602534, 0.71449584, 0.72221009,\n",
      "       0.72891182]), 'split1_test_score': array([0.70897937, 0.72040118, 0.71674895, 0.72321513, 0.71760517,\n",
      "       0.71016163, 0.71208047, 0.723853  , 0.72343348, 0.72445497,\n",
      "       0.70677935, 0.71788485, 0.72204932, 0.72181825, 0.71670184,\n",
      "       0.72201043, 0.72191097, 0.72210017, 0.71914713, 0.70480742,\n",
      "       0.72444749, 0.71460951, 0.73188132, 0.7270229 , 0.71896167,\n",
      "       0.71492284, 0.70968753, 0.72049914, 0.72698027, 0.71821612,\n",
      "       0.72200669, 0.7266318 , 0.7211385 , 0.72192518, 0.72344919,\n",
      "       0.71626737]), 'split2_test_score': array([0.72450806, 0.72467333, 0.71463793, 0.71624194, 0.72975384,\n",
      "       0.7275456 , 0.71697104, 0.71284771, 0.72321363, 0.72940238,\n",
      "       0.73622151, 0.73345393, 0.71801496, 0.72630127, 0.72182946,\n",
      "       0.72743044, 0.71811592, 0.7319374 , 0.71090867, 0.71937072,\n",
      "       0.7168155 , 0.73388765, 0.72242022, 0.71664052, 0.71645581,\n",
      "       0.71756479, 0.71393724, 0.72600814, 0.72127759, 0.72311044,\n",
      "       0.71842999, 0.72259221, 0.73021897, 0.73139226, 0.72211662,\n",
      "       0.71696207]), 'split3_test_score': array([0.73211911, 0.74431938, 0.73260443, 0.73678535, 0.74493855,\n",
      "       0.74195112, 0.73470873, 0.73938693, 0.73453   , 0.73691472,\n",
      "       0.73742023, 0.74587928, 0.73525312, 0.73911324, 0.73227241,\n",
      "       0.74220088, 0.74339062, 0.73263584, 0.73954995, 0.74092439,\n",
      "       0.73028851, 0.7422121 , 0.7364623 , 0.7374793 , 0.74397689,\n",
      "       0.7412968 , 0.73614374, 0.72065991, 0.73795789, 0.74316254,\n",
      "       0.7410231 , 0.7368549 , 0.74085784, 0.74409355, 0.73721459,\n",
      "       0.73670384]), 'split4_test_score': array([0.73521703, 0.71386386, 0.72788613, 0.72607978, 0.72703569,\n",
      "       0.72546644, 0.72082077, 0.72020518, 0.72462871, 0.73067458,\n",
      "       0.72174302, 0.73182048, 0.71088093, 0.71314431, 0.72455391,\n",
      "       0.72579106, 0.73817976, 0.72637822, 0.72612316, 0.72513957,\n",
      "       0.73712811, 0.72567662, 0.71780493, 0.728676  , 0.74135267,\n",
      "       0.73382505, 0.72954365, 0.73168435, 0.72244088, 0.72238852,\n",
      "       0.73340993, 0.73529407, 0.72388597, 0.73390209, 0.74032271,\n",
      "       0.73511381]), 'mean_test_score': array([0.72289623, 0.72330036, 0.72129874, 0.72693911, 0.72688831,\n",
      "       0.72418974, 0.72120103, 0.72271319, 0.72764317, 0.72803321,\n",
      "       0.72325661, 0.7309537 , 0.72141861, 0.72455407, 0.72461983,\n",
      "       0.72889398, 0.72778575, 0.72781001, 0.72221231, 0.7200779 ,\n",
      "       0.72752158, 0.72634863, 0.7261459 , 0.72384965, 0.72860922,\n",
      "       0.72458214, 0.72046054, 0.72551902, 0.72974332, 0.7266781 ,\n",
      "       0.72648346, 0.73044133, 0.72842532, 0.72916178, 0.72906264,\n",
      "       0.72679178]), 'std_test_score': array([0.01018326, 0.01133373, 0.0074958 , 0.00714864, 0.01057346,\n",
      "       0.01090993, 0.00753299, 0.00908322, 0.00482867, 0.00612019,\n",
      "       0.01204977, 0.00925049, 0.00793339, 0.00845409, 0.00526863,\n",
      "       0.00692351, 0.01085226, 0.00395622, 0.01000386, 0.01258967,\n",
      "       0.00672295, 0.01065415, 0.00690879, 0.00978817, 0.01165469,\n",
      "       0.01089488, 0.01041996, 0.00441494, 0.00782995, 0.00865445,\n",
      "       0.00921007, 0.00530958, 0.00688837, 0.01017705, 0.00799949,\n",
      "       0.00871075]), 'rank_test_score': array([29, 27, 33, 14, 15, 25, 34, 30, 12,  9, 28,  1, 32, 24, 22,  6, 11,\n",
      "       10, 31, 36, 13, 19, 20, 26,  7, 23, 35, 21,  3, 17, 18,  2,  8,  4,\n",
      "        5, 16])}\n",
      "\t\n",
      "{'reg_alpha': 0.01, 'reg_lambda': 0.3}\n",
      "\t\n",
      "0.7309536989940078\n"
     ]
    }
   ],
   "execution_count": 24
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:54:32.191284Z",
     "start_time": "2025-06-10T05:54:16.972429Z"
    }
   },
   "source": [
    "import lightgbm as lgb\n",
    "\n",
    "# 最佳参数\n",
    "best_params = {\n",
    "    'boosting_type': 'gbdt',\n",
    "    'learning_rate': 0.005,\n",
    "    'num_leaves': 30,\n",
    "    'max_depth': -1,\n",
    "    'bagging_fraction': 0.5,\n",
    "    'feature_fraction': 0.6,\n",
    "    'min_data_in_leaf': 20,\n",
    "    'min_sum_hessian_in_leaf': 0.001,\n",
    "    'lambda_l1': 0.3,\n",
    "    'lambda_l2': 0.03,\n",
    "    'metric': 'auc',\n",
    "    'verbose': -1  # 控制日志级别\n",
    "}\n",
    "\n",
    "# 创建早停回调函数\n",
    "callbacks = [\n",
    "    lgb.early_stopping(stopping_rounds=5, verbose=True),  # 早停回合数\n",
    "    lgb.log_evaluation(period=50)  # 每50轮打印一次评估结果\n",
    "]\n",
    "\n",
    "# 交叉验证\n",
    "best_cv = lgb.cv(\n",
    "    params=best_params,\n",
    "    train_set=lgb_train,\n",
    "    num_boost_round=2000,\n",
    "    nfold=5,\n",
    "    stratified=True,\n",
    "    shuffle=True,\n",
    "    seed=0,\n",
    "    callbacks=callbacks  # 传入早停回调\n",
    ")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training until validation scores don't improve for 5 rounds\n",
      "[50]\tvalid's auc: 0.686346 + 0.00289864\n",
      "[100]\tvalid's auc: 0.69385 + 0.00323699\n",
      "[150]\tvalid's auc: 0.69814 + 0.0030076\n",
      "[200]\tvalid's auc: 0.703857 + 0.0033066\n",
      "[250]\tvalid's auc: 0.70878 + 0.00380101\n",
      "[300]\tvalid's auc: 0.71322 + 0.00406633\n",
      "[350]\tvalid's auc: 0.717066 + 0.00505571\n",
      "[400]\tvalid's auc: 0.72032 + 0.0048318\n",
      "[450]\tvalid's auc: 0.722301 + 0.00562041\n",
      "[500]\tvalid's auc: 0.724385 + 0.00603217\n",
      "[550]\tvalid's auc: 0.726077 + 0.00614192\n",
      "[600]\tvalid's auc: 0.727909 + 0.00638719\n",
      "[650]\tvalid's auc: 0.729455 + 0.006379\n",
      "Early stopping, best iteration is:\n",
      "[687]\tvalid's auc: 0.730509 + 0.00600826\n"
     ]
    }
   ],
   "execution_count": 26
  },
  {
   "cell_type": "code",
   "metadata": {
    "scrolled": true,
    "ExecuteTime": {
     "end_time": "2025-06-10T05:54:34.711113Z",
     "start_time": "2025-06-10T05:54:34.706077Z"
    }
   },
   "source": [
    "# 动态查找 AUC 结果的键名\n",
    "auc_key = next((k for k in best_cv.keys() if 'auc' in k.lower() and 'mean' in k.lower()), None)\n",
    "if auc_key:\n",
    "    best_iteration = len(best_cv[auc_key])\n",
    "    best_auc = best_cv[auc_key][-1]\n",
    "    print(f\"最佳迭代次数: {best_iteration}\")\n",
    "    print(f\"交叉验证 AUC: {best_auc:.6f}\")\n",
    "else:\n",
    "    print(\"错误：未找到 AUC 相关的评估结果！\")\n",
    "    print(\"可用结果:\", best_cv.keys())"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最佳迭代次数: 687\n",
      "交叉验证 AUC: 0.730509\n"
     ]
    }
   ],
   "execution_count": 27
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:54:44.328224Z",
     "start_time": "2025-06-10T05:54:39.606904Z"
    }
   },
   "source": [
    "lgb_single_model = lgb.LGBMClassifier(n_estimators=900,\n",
    "                                learning_rate=0.005,\n",
    "                                min_child_weight=0.001,\n",
    "                                min_child_samples = 20,\n",
    "                                subsample=0.5,\n",
    "                                colsample_bytree=0.6,\n",
    "                                num_leaves=30,\n",
    "                                max_depth=-1,\n",
    "                                reg_lambda=0.03,\n",
    "                                reg_alpha=0.3,\n",
    "                                random_state=0)\n",
    "lgb_single_model.fit(x_train,y_train)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LGBMClassifier(colsample_bytree=0.6, learning_rate=0.005, n_estimators=900,\n",
       "               num_leaves=30, random_state=0, reg_alpha=0.3, reg_lambda=0.03,\n",
       "               subsample=0.5)"
      ],
      "text/html": [
       "<style>#sk-container-id-1 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-1 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-1 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-1 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-1 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-1 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-1 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-1 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-1 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-1 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-1 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LGBMClassifier(colsample_bytree=0.6, learning_rate=0.005, n_estimators=900,\n",
       "               num_leaves=30, random_state=0, reg_alpha=0.3, reg_lambda=0.03,\n",
       "               subsample=0.5)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;LGBMClassifier<span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>LGBMClassifier(colsample_bytree=0.6, learning_rate=0.005, n_estimators=900,\n",
       "               num_leaves=30, random_state=0, reg_alpha=0.3, reg_lambda=0.03,\n",
       "               subsample=0.5)</pre></div> </div></div></div></div>"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 28
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-10T05:54:47.014254Z",
     "start_time": "2025-06-10T05:54:46.751243Z"
    }
   },
   "source": [
    "pre = lgb_single_model.predict_proba(x_test)[:,1]\n",
    "print('lightgbm单模型的AUC：{}'.format(metrics.roc_auc_score(y_test,pre)))\n",
    "sc.plot_roc(y_test,pre)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lightgbm单模型的AUC：0.7347199344367511\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ],
      "image/png": "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gpGRgTtnDHGbN1F034MY6c3MLklERCTqNPqwcOyxlSY3ut2kPHAvJRddjK9jVtml0bdqKaSIiEgIBT3BMT8/n+zsbLp06UK3bt2477778Pl8Nd67fPlyBg4cSKdOnTj//PP56KOPgi5w+vRiLBaI/3Ql6Wefjv2Jx3Dk3AR+f9kNCgoiIiIhFXRYyM3NxW63s2LFCubOncuqVat47rnn9rtv27ZtjBw5kpycHD777DNGjhxJbm4uu3fvDurzWUo8pIy7laaDz8e2dQv+I47Edfd4iIsLtnQRERGph6DCwvbt21mzZg1jx44lOTmZVq1akZ2dzZw5c/a796233qJLly706dMHm81Gv379OPXUU3nttdeCKjBjxDXYn3oCi2HgueL/KFixmtLe5wb1MURERKT+gpqzsHHjRtLS0jj88MMrrrVr145du3axb98+mjRpUnF906ZNHHfccVUef+yxx/L9998HVWB80yb4+56He/RYfKd2Q/0JoVM+omOzWTEMc2uJFWrz8FObh5/aPPxstobdRimosOByuUhOTq5yrfxtt9tdJSzUdG9SUhJutzu4Cl9+mTjAEdyj5BCkpaWYXULMUZuHn9o8/NTmkSuo6GG32/F4PFWulb+dklL1SZCcnExxcXGVa8XFxfvdJyIiIo1bUGGhffv2FBYWkpeXV3Ft8+bNtGzZEoej6t/+xx13HBs3bqxybdOmTbRv3/4QyhUREZFwCyostG7dms6dOzN58mSKiorYuXMns2fPZujQofvdO2jQINasWcOCBQvw+XwsWLCANWvWMHjw4AYrXkRERELPYhjBTTfJy8tj4sSJrF69GqvVygUXXMAtt9xCXFwcWVlZTJgwgUGDBgGwYsUKpk6dyo4dOzjqqKMYO3YsZ555Zki+EBEREQmNoMOCiIiIxJaIOKJaREREzKOwICIiIrVSWBAREZFaKSyIiIhIrUwNC+E+wVKCa/NXXnmFvn37kpWVRd++fWs8A0QOLpg2L/fjjz/SsWNHVq9eHaYqo0swbb5mzRouvvhisrKyOPPMM3nyySfDXG10CKbNn3/+eXr16sUpp5zCwIEDWbRoUZirjS579uzhnHPOqfX3xSG/hhomuvLKK40xY8YYbrfb2LFjh9G/f3/jqaee2u++rVu3GieffLKxePFiw+v1Gu+9957RoUMH49dffzWh6shW1zZfvHix0aVLF2PdunVGIBAwvvjiC6NLly7GwoULTag6stW1zcu53W5jwIABxnHHHWd8+umnYaw0etS1zTdt2mR07NjRePPNN41AIGB89913RteuXY3333/fhKojW13bfNmyZUb37t2NzZs3G4ZhGAsXLjSOP/54Y+fOneEuOSp89tlnRp8+fWr9fdEQr6Gm9SyYcYJlrAumzXfv3s2wYcPo1KkTFouFrKwsunXrxtq1a02oPHIF0+blJkyYQJ8+fcJYZXQJps1ffvllevfuzYUXXojFYuH444/n1VdfpXPnziZUHrmCafMtW7ZgGEbFv7i4OOLj47HZgjqqSCh7bbzlllsYNWrUQe871NdQ08LCwU6wrKyhTrCMdcG0+RVXXMH1119f8XZ+fj5r164lMzMzbPVGg2DaHODtt99m+/btjBgxIpxlRpVg2vyrr77i6KOPZvTo0XTr1o3zzz+fNWvW0KJFi3CXHdGCafP+/fuTkZFBv379OOmkk8jJyeGBBx6gZcuW4S474vXo0YPFixfTr1+/Wu9riNdQ08LCwU6wPNi99TrBMsYF0+aV/f777wwbNozMzEwGDBgQ0hqjTTBtvnnzZqZNm8bDDz9MXJwOY6+vYNp87969vPDCCwwaNIhPPvmEiRMn8uCDD7Jw4cKw1RsNgmlzr9fL8ccfz+uvv8769euZOHEi48aN44cffghbvdGiRYsWdeqRaYjXUNPCgk6wDL9g2rzc+vXrGTp0KG3atOHxxx9XV2GQ6trmJSUljBo1ijvvvJMjjzwyrDVGm2Ce5wkJCfTu3ZuzzjoLm83GqaeeyuDBg3n//ffDVm80CKbNJ02aRPv27enQoQMJCQlcdNFFdOrUibfeeits9caahngNNS0s6ATL8AumzQHmzp3LNddcw9VXX83DDz9MQkJCOMuNCnVt86+//ppt27Yxbtw4unTpQpcuXQC44YYbGD9+fLjLjmjBPM/btWtHaWlplWt+vx9Du+AHJZg237Vr135tbrPZiI+PD0utsahBXkMbYjZmfV122WXGqFGjDKfTWTF7dubMmfvdt2nTJuPkk0823nvvvYqZnCeffLKxZcsWE6qObHVt84ULFxonnXSS8fHHH5tQZXSpa5tXp9UQ9VfXNl+5cqVx4oknGm+//bYRCASMNWvWGJ06dTKWLFliQtWRra5tPm3aNKNbt27GN998Y/j9fuP99983Tj75ZOPbb781oeroUdvvi4Z4DTU1LPz+++/GyJEjja5duxqnnXaa8cADDxg+n88wDMPo1KmT8c4771Tc+/HHHxuDBg0yOnXqZPTv399YtmyZWWVHtLq2+YABA4zjjz/e6NSpU5V/d999t5nlR6RgnueVKSzUXzBtvmzZMmPIkCFGVlaW0bt3b+OVV14xq+yIVtc293q9xsyZM42zzz7bOOWUU4wLL7xQf5Q0gOq/Lxr6NVSnToqIiEittN2ziIiI1EphQURERGqlsCAiIiK1UlgQERGRWiksiIiISK0UFkRERKRWCgsiIiJSK4UFERERqZXCgoiIiNRKYUFERERqpbAgIiIitVJYEBERkVr9P+lD4mEt1bXXAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 29
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
